package com.example.dp01.api;

import com.example.dp01.constant.REnum;
import com.example.dp01.dao.StudentRepository;
import com.example.dp01.entity.Student;
import com.example.dp01.exception.RException;
import com.example.dp01.service.StudentService;
import com.example.dp01.util.RUtil;
import com.example.dp01.vo.QueryObj;
import com.example.dp01.vo.R;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.*;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/api/student")
public class StudentApiController {
    @Autowired
    private StudentService studentService;
    @Autowired
    private StudentRepository studentRepository;

    @GetMapping("/list")
    public R<List<Student>> findAll(){

        List<Student> students= studentService.getAll();
        return RUtil.success(students);
    }
    @GetMapping("/{id}")
    public R<Student> findById(@PathVariable Integer id) {
        if (id == null) {
            // 这里可以根据您的业务需求抛出自定义异常或者返回一个适当的响应
            throw new IllegalArgumentException("学生ID不能为空");
        }
        Student student = studentService.findById(id);
        return RUtil.success(student);
    }

    @PostMapping("/add")
    public R<Student> add( Student student){
        return RUtil.success(studentService.add(student));
    }
    @PutMapping("/update")
    public R<Student> update(Student student){
        return RUtil.success(studentService.update(student));
    }
    @DeleteMapping("/delete/{id}")
    public R delete(@PathVariable Integer id){
        studentService.delete(id);
        return RUtil.success();

    }

    @GetMapping("/validateUser")
    public R validateSnoAndPassword(String sno, String password) throws Exception {
        return RUtil.success(studentService.validateUsernameAndPassword(sno,password));
    }
    @PostMapping("/getbypage")
    public R<Page<Student>> getByPage(@RequestBody QueryObj<Student> qObj){
        Sort sort=Sort.by(Sort.Direction.DESC,"id");
        Integer pageIndex=0;
        Integer pageSize=10;

        if(qObj==null){
            Pageable pageable= PageRequest.of(pageIndex,pageSize,sort);
            Page<Student> students=studentService.getAll(pageable);
            return RUtil.success(students.getContent(),students.getTotalElements());
        }else{
            pageIndex=qObj.getPage()-1;
            pageSize=qObj.getLimit();

            if(qObj.getData() instanceof Student){
                Student student=(Student) qObj.getData();
                Pageable pageable=PageRequest.of(pageIndex,pageSize,sort);

                ExampleMatcher matcher=ExampleMatcher.matching()
                        .withMatcher("name",ExampleMatcher.GenericPropertyMatchers.contains())
                        .withIgnoreNullValues();

                Example<Student> example=Example.of(student,matcher);
                Page<Student> studentPage=studentService.getAll(example,pageable);
                return RUtil.success(studentPage.getContent(),studentPage.getTotalElements());
            }else{
                throw new RException(REnum.QUERY_ERR);
            }
        }
    }

}
